`include "defines.v"

module riscv_soc(
    input wire clk,
    input wire rst

    );


    //from riscv_top
    wire[`MemAddrBus] riscv_rib_ex_addr_o;    // 璇伙拷?锟藉啓澶栬鐨勫湴锟�?
    wire[`MemBus] riscv_rib_ex_data_o;       // 鍐欏叆澶栬鐨勬暟锟�?
    wire riscv_rib_ex_req_o;                  // 璁块棶澶栬璇锋眰
    wire riscv_rib_ex_we_o;                   // 鍐欏璁炬爣锟�?
    wire[`MemAddrBus] riscv_rib_pc_addr_o;    // 鍙栨寚鍦板潃

    //from inst_ram
    wire[`InstBus] inst_ram_inst_o;

    //from ex_memory
    wire[`MemBus] memory_rdata_o;

    //from rib
        //master 0 interface
        wire[`MemBus] m0_data_o;         // 涓昏锟�?0璇诲彇鍒扮殑鏁版嵁
        wire m0_ack_o;                   // 涓昏锟�?0璁块棶瀹屾垚鏍囧織

        // master 1 interface
        wire[`MemBus] m1_data_o;         // 涓昏锟�?1璇诲彇鍒扮殑鏁版嵁//instruction
        wire m1_ack_o;                  // 涓昏锟�?1璁块棶瀹屾垚鏍囧織
        
        //master 2
        wire[`MemBus] m2_data_o;         // 涓昏锟�?1璇诲彇鍒扮殑鏁版嵁//instruction
        wire m2_ack_o;  
        //master 3
        wire[`MemBus] m3_data_o;         // 涓昏锟�?1璇诲彇鍒扮殑鏁版嵁//instruction
        wire m3_ack_o;  

        // slave 0 interface
        wire[`MemAddrBus] s0_addr_o;     // 浠庤锟�?0璇伙拷?锟藉啓鍦板潃
        wire[`MemBus] s0_data_o;         // 浠庤锟�?0鍐欐暟锟�?
        wire s0_req_o;                   // 浠庤锟�?0璁块棶璇锋眰鏍囧織
        wire s0_we_o;                    // 浠庤锟�?0鍐欐爣锟�?

        // slave 1 interface
        wire[`MemAddrBus] s1_addr_o;     // 浠庤锟�?1璇伙拷?锟藉啓鍦板潃
        wire[`MemBus] s1_data_o;         // 浠庤锟�?1鍐欐暟锟�?
        wire s1_req_o;                   // 浠庤锟�?1璁块棶璇锋眰鏍囧織
        wire s1_we_o;                    // 浠庤锟�?1鍐欐爣锟�?
        //slave 2
        wire[`MemAddrBus] s2_addr_o;     // 浠庤锟�?0璇伙拷?锟藉啓鍦板潃
        wire[`MemBus] s2_data_o;         // 浠庤锟�?0鍐欐暟锟�?
        wire s2_req_o;                   // 浠庤锟�?0璁块棶璇锋眰鏍囧織
        wire s2_we_o;                    // 浠庤锟�?0鍐欐爣锟�?
        //slave 3
        wire[`MemAddrBus] s3_addr_o;     // 浠庤锟�?0璇伙拷?锟藉啓鍦板潃
        wire[`MemBus] s3_data_o;         // 浠庤锟�?0鍐欐暟锟�?
        wire s3_req_o;                   // 浠庤锟�?0璁块棶璇锋眰鏍囧織
        wire s3_we_o;                    // 浠庤锟�?0鍐欐爣锟�?
        //slave 4
        wire[`MemAddrBus] s4_addr_o;     // 浠庤锟�?0璇伙拷?锟藉啓鍦板潃
        wire[`MemBus] s4_data_o;         // 浠庤锟�?0鍐欐暟锟�?
        wire s4_req_o;                   // 浠庤锟�?0璁块棶璇锋眰鏍囧織
        wire s4_we_o;                    // 浠庤锟�?0鍐欐爣锟�?
        //slave 5
        wire[`MemAddrBus] s5_addr_o;     // 浠庤锟�?0璇伙拷?锟藉啓鍦板潃
        wire[`MemBus] s5_data_o;         // 浠庤锟�?0鍐欐暟锟�?
        wire s5_req_o;                  // 浠庤锟�?0璁块棶璇锋眰鏍囧織
        wire s5_we_o;                    // 浠庤锟�?0鍐欐爣锟�?

        wire  rib_hold_flag_o;                 // 鏆傚仠娴佹按绾挎爣锟�?
        
    rib u_rib(
        .clk(clk),
        .rst(rst),

        // master 0 interface ex
        .m0_addr_i(riscv_rib_ex_addr_o),
        .m0_data_i(riscv_rib_ex_data_o),
        .m0_data_o(m0_data_o),
        .m0_ack_o(m0_ack_o),
        .m0_req_i(riscv_rib_ex_req_o),
        .m0_we_i(riscv_rib_ex_we_o),

        // master 1 interface pc
        .m1_addr_i(riscv_rib_pc_addr_o),
        .m1_data_i(`ZeroWord),//default setting
        .m1_data_o(m1_data_o),
        .m1_ack_o(m1_ack_o),
        .m1_req_i(`RIB_REQ),//default setting
        .m1_we_i(`WriteDisable),//default setting

        // master 2 interface
        .m2_addr_i(`ZeroWord),
        .m2_data_i(`ZeroWord),
        .m2_data_o(m2_data_o),
        .m2_ack_o(m2_ack_o),
        .m2_req_i(`RIB_NREQ),
        .m2_we_i(`WriteDisable),

        // master 3 interface
        .m3_addr_i(`ZeroWord),
        .m3_data_i(`ZeroWord),
        .m3_data_o(m3_data_o),
        .m3_ack_o(m3_ack_o),
        .m3_req_i(`RIB_NREQ),
        .m3_we_i(`WriteDisable),

        // slave 0 interface instrucment
        .s0_addr_o(s0_addr_o),
        .s0_data_o(s0_data_o),
        .s0_data_i(inst_ram_inst_o),
        .s0_ack_i(`RIB_ACK),
        .s0_req_o(s0_req_o),
        .s0_we_o(s0_we_o),

        // slave 1 interface memory
        .s1_addr_o(s1_addr_o),
        .s1_data_o(s1_data_o),
        .s1_data_i(memory_rdata_o),
        .s1_ack_i(`RIB_NACK),
        .s1_req_o(s1_req_o),
        .s1_we_o(s1_we_o),

        // slave 2 interface
        .s2_addr_o(s2_addr_o),
        .s2_data_o(s2_data_o),
        .s2_data_i(`ZeroWord),
        .s2_ack_i(`RIB_NACK),
        .s2_req_o(s2_req_o),
        .s2_we_o(s2_we_o),

        // slave 3 interface
        .s3_addr_o(s3_addr_o),
        .s3_data_o(s3_data_o),
        .s3_data_i(`ZeroWord),
        .s3_ack_i(`RIB_NACK),
        .s3_req_o(s3_req_o),
        .s3_we_o(s3_we_o),

        // slave 4 interface
        .s4_addr_o(s4_addr_o),
        .s4_data_o(s4_data_o),
        .s4_data_i(`ZeroWord),
        .s4_ack_i(`RIB_NACK),
        .s4_req_o(s4_req_o),
        .s4_we_o(s4_we_o),

        // slave 5 interface
        .s5_addr_o(s5_addr_o),
        .s5_data_o(s5_data_o),
        .s5_data_i(`ZeroWord),
        .s5_ack_i(`RIB_NACK),
        .s5_req_o(s5_req_o),
        .s5_we_o(s5_we_o),

        .hold_flag_o(rib_hold_flag_o)
    );


    inst_ram u_inst_ram(
    .rst(rst),
    .instaddr_i(s0_addr_o),
    .inst_o(inst_ram_inst_o)
    );

    ex_mem u_ex_mem(
    .clk(clk),
    .rst(rst),
    .addr_i(s1_addr_o),
    .wdata_i(s1_data_o),
    .we_i(s1_we_o),
    .rdata_o(memory_rdata_o)
    );

    riscv u_riscv(
    .clk(clk),
    .rst(rst),

    .rib_ex_data_i(m0_data_o),         // 浠庡璁捐鍙栫殑鏁版嵁
    .rib_hold_flag_i(rib_hold_flag_o),                // 鎬荤嚎鏆傚仠鏍囧織
    .rib_ex_addr_o(riscv_rib_ex_addr_o),    // 璇伙拷?锟藉啓澶栬鐨勫湴锟�?
    .rib_ex_data_o(riscv_rib_ex_data_o),        // 鍐欏叆澶栬鐨勬暟锟�?
    .rib_ex_req_o(riscv_rib_ex_req_o),                  // 璁块棶澶栬璇锋眰
    .rib_ex_we_o(riscv_rib_ex_we_o),                   // 鍐欏璁炬爣锟�?

    .rib_pc_addr_o(riscv_rib_pc_addr_o),    // 鍙栨寚鍦板潃
    .rib_pc_data_i(m1_data_o)         // 鍙栧埌鐨勬寚浠ゅ唴锟�?
    
    );

endmodule
